<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>generator</title>
</head>
<body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script>
    /*
    * generator函数是一个状态机(迭代生成器，封装了多个内部状态, 返回值是一个迭代器(iterator);
    * generator可以用于 异步调用
    * */


    //语法
    //generator函数 在function后面增加一个*
    //generator函数内部,会有一个yield 表达式;
    function * gen() {
        console.log("generator", 1);
        yield "a";
        console.log("generator", 2);
        return "b"
    }
    let it = gen();
//    console.log(it.next());// console.log("generator", 1);  //{value: "a", done: false}
//    console.log(it.next());// console.log("generator", 2);  //{value: "b", done: true}
//    console.log(it.next());
    //generator执行方式和普通函数一样,在后面加上()即可.
    //如果只是单纯调用generator函数,是不会有任何输出的.
    //返回的是一个iterator对象, 函数内部没有任何执行
    //当我们调用next方法的时候 函数内部代码开始执行,
    //遇到yield表达式之后 函数停止执行 并且返回yield之后的值, 如果返回值done属性为false,则可以继续使用next方法执行, 遇到下一个yield或者return之后停止执行


    {
        //yield 1 ==> next()返回值
        //let a = yield  ==> next(1) 传参
        function * gen() {
            console.log("generator", 1);
            let a = yield "666";
            console.log("generator", a); //20
            let b = yield "888";
            console.log("generator", b);
        }
        let it = gen();
        console.log(it.next(10)); //{value: "666", done: false} //第一个next的传参没有任何意义
        console.log(it.next(20)); //{value: "888", done: false}
        console.log(it.next(30));
    }

    {//generator获取数据
//        aaa => bbb => ccc

        function myAjax(url) {
            $.ajax({
                url: url,
                success(data){
                    console.log("data===>", data);
                    it.next()
                }
            });
        }

        function * getData() {
            yield myAjax("./data/aaa.txt");
            yield myAjax("./data/bbb.txt");
            yield myAjax("./data/ccc.txt")
        }

        let it = getData();
        it.next();

    }


</script>
</body>
</html>